#pragma once

#include <iostream>
#include <signal.h>
#include <fcntl.h>

const char *root = "/";
const char *dev_null = "/dev/null";

void deamon(bool is_change_dir,bool isclose) //  创建守护进程
{

    //  忽略可能引起程序异常退出的信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    if (fork() > 0)
        exit(0); // 父进程退出

    // child

    // 让自己称为新的会话，因为调用这个函数，调用进程不能是进程组的组长，而一个进程默认自己是一个新的会话
    setsid();

    if (is_change_dir)
    {
        // 修改进程的默认路径为 根目录
        chdir(root);
    }


    if(isclose)  // 如果需要关闭，就将三个标准输入输出关闭
    {
        close(0);
        close(1);
        close(2);
    }
    else
    {
        // 当前已经是独立的会话了

        //  /dev/null  这个null配置文件写的任何东西，都会自动被丢弃
        //  echo "hello" > null  // 读xejinqu
        //  cat < null   // 读出来的都是 空
        int fd = open(dev_null, O_RDWR); // O_RD WR   Open_ReadWrite
        if (fd > 0)
        {
            // 将标准输入，输出，错误全部定义到
            dup2(fd, 0);
            //dup2(fd, 1);
            dup2(fd, 2);

            close(fd);  //重定向后关闭文件描述符
        }
    }
}
